package visiopuce.service;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import org.apache.commons.lang.StringUtils;

import visiopuce.ApplicationContexte;
import visiopuce.HibernateUtil;
import visiopuce.DAO.AlterationDAO;
import visiopuce.DAO.AlterationDAOImpl;
import visiopuce.DAO.AnalyseDAOImpl;
import visiopuce.DAO.AnnotationDAO;
import visiopuce.DAO.AnnotationDAOImpl;
import visiopuce.DAO.HistoriqueDAO;
import visiopuce.DAO.HistoriqueDAOImpl;
import visiopuce.DAO.PrelevementDAOImpl;
import visiopuce.DAO.PuceDAO;
import visiopuce.DAO.PuceDAOImpl;
import visiopuce.DAO.RenduBiomolDAOImpl;
import visiopuce.DAO.RenduFishDAOImpl;
import visiopuce.DAO.ResultatDAOImpl;
import visiopuce.DAO.TypeAnalyseDAOImpl;
import visiopuce.DAO.VerifBiomolDAOImpl;
import visiopuce.DAO.VerifFishDAOImpl;
import visiopuce.objets.Alteration;
import visiopuce.objets.Analyse;
import visiopuce.objets.Annotation;
import visiopuce.objets.ControleQualite;
import visiopuce.objets.Historique;
import visiopuce.objets.Personne;
import visiopuce.objets.Prelevement;
import visiopuce.objets.Puce;
import visiopuce.objets.RenduBiomol;
import visiopuce.objets.RenduFish;
import visiopuce.objets.Resultat;
import visiopuce.objets.TypeAnalyse;
import visiopuce.objets.TypeCausal;
import visiopuce.objets.TypePuce;
import visiopuce.objets.TypeQC;
import visiopuce.objets.VerifBiomol;
import visiopuce.objets.VerifFish;

public class AlterationServiceImpl implements AlterationService {

	private AlterationDAO alterationDAO = AlterationDAOImpl.getInstance();
	private PuceDAO puceDAO = PuceDAOImpl.getInstance();
	private AnnotationDAO annotationDAO = AnnotationDAOImpl.getInstance();
	private HistoriqueDAO historiqueDAO = HistoriqueDAOImpl.getInstance();

	/** Constructeur privé */
	private AlterationServiceImpl() {
	}

	/** Instance unique non préinitialisée */
	private static AlterationServiceImpl INSTANCE = null;

	/** Point d'accès pour l'instance unique du singleton */
	public static AlterationService getInstance() {
		if (INSTANCE == null) {
			INSTANCE = new AlterationServiceImpl();
		}
		return INSTANCE;
	}

	public List<Alteration> findAllByidPuce(Integer idPuce) {
		List<Alteration> alterations = null;

		HibernateUtil.beginTransaction();
		alterations = alterationDAO.findAllByidPuce(idPuce);
		HibernateUtil.commitTransaction();
		HibernateUtil.closeSession();
		return alterations;
	}

	public Alteration refresh(Alteration cnv) {
		HibernateUtil.beginTransaction();
		HibernateUtil.getSession().refresh(cnv);
		HibernateUtil.closeSession();
		return cnv;
	}

	@Override
	public List<Alteration> getCNVChevauchant(Alteration alteration, int seuil) {
		List<Alteration> alterations = null;
		// long tailleChr =
		// ReferentielServiceImpl.getInstance().getTailleChromosome(alteration.getChromosome());
		HibernateUtil.beginTransaction();
		alterations = alterationDAO.getCNVChevauchant(alteration, seuil);
		HibernateUtil.commitTransaction();
		HibernateUtil.closeSession();
		return alterations;
	}

	@Override
	public List getCNVChevauchant4Graph(Alteration alteration, int seuil) {
		List alterations = null;
		// long tailleChr =
		// ReferentielServiceImpl.getInstance().getTailleChromosome(alteration.getChromosome());
		HibernateUtil.beginTransaction();
		alterations = alterationDAO.getCNVChevauchant4Graph(alteration, seuil);
		HibernateUtil.commitTransaction();
		HibernateUtil.closeSession();
		return alterations;
	}

	@Override
	public Alteration getAlterationById(int idAlt) {
		Alteration alt = null;
		HibernateUtil.beginTransaction();
		alt = alterationDAO.findByID(Alteration.class, idAlt);
		HibernateUtil.commitTransaction();
		HibernateUtil.closeSession();
		return alt;
	}

	private boolean estCNPc(Alteration alt) {
		boolean estCNPc = false;
		HibernateUtil.beginTransaction();
		estCNPc = alterationDAO.estCNPc(alt);
		HibernateUtil.commitTransaction();
		HibernateUtil.closeSession();
		return estCNPc;
	}

	@Override
	public List<Annotation> getAnnotationsByAlteration(Integer idAlteration) {
		List<Annotation> annotations = null;
		HibernateUtil.beginTransaction();
		annotations = annotationDAO.getAnnotationByAlteration(idAlteration);
		HibernateUtil.commitTransaction();
		HibernateUtil.closeSession();
		return annotations;
	}

	private boolean cnvExiste(Alteration alt) {
		boolean existe = false;
		HibernateUtil.beginTransaction();
		existe = alterationDAO.cnvExiste(alt);
		HibernateUtil.commitTransaction();
		HibernateUtil.closeSession();
		return existe;
	}

	@Override
	public void save(Alteration cnv) {
		HibernateUtil.beginTransaction();
		try {
			boolean enrAnnotTypeCausal = false;
			if (cnv.getIdAlteration() == 0 && cnv.getEstCnpCalc()) {
				enrAnnotTypeCausal = true;
			}
			alterationDAO.save(cnv);
			Historique h = new Historique();
			h.setDate(new Date());
			h.setRequete("Enregistrement " + cnv.toString());
			h.setUtilisateur(ApplicationContexte.getInstance().getUtilisateur());
			historiqueDAO.save(h);
			if (enrAnnotTypeCausal) {
				SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
				Date datedujour = new Date();
				TypeCausal tc = new TypeCausal();
				tc.setIdTypeCausal(5);
				Annotation annotation1 = new Annotation();
				annotation1.setAlteration(cnv);
				annotation1.setCausale(tc);
				annotation1.setIdAnnotation(0);
				annotation1.setNumero(1);
				annotation1.setNote(0);
				annotation1.setTexte("Le CNV est entièrement recouvert par les zones CNP déterminées par Montpellier. (" + formatter.format(datedujour) + "-Annotation automatique)");
				cnv.setAnnotationPA(annotation1);

				Annotation annotation2 = new Annotation();
				annotation2.setAlteration(cnv);
				annotation2.setCausale(tc);
				annotation2.setIdAnnotation(0);
				annotation2.setNumero(2);
				annotation2.setNote(0);
				annotation2.setTexte("Le CNV est entièrement recouvert par les zones CNP déterminées par Montpellier. (" + formatter.format(datedujour) + "-Annotation automatique)");
				cnv.setAnnotationS(annotation2);

				cnv.setAnnotationFinale("Polymorphisme");

			}
			if (cnv.getAnnotationPA() != null) {
				annotationDAO.save(cnv.getAnnotationPA());

				Historique h2 = new Historique();
				h2.setDate(new Date());
				h2.setRequete("Enregistrement " + cnv.getAnnotationPA().toString());
				h2.setUtilisateur(ApplicationContexte.getInstance().getUtilisateur());
				historiqueDAO.save(h2);
			}

			if (cnv.getAnnotationS() != null) {
				annotationDAO.save(cnv.getAnnotationS());

				Historique h1 = new Historique();
				h1.setDate(new Date());
				h1.setRequete("Enregistrement " + cnv.getAnnotationS().toString());
				h1.setUtilisateur(ApplicationContexte.getInstance().getUtilisateur());
				historiqueDAO.save(h1);
			}
			if (cnv.isaVerifBioMol() || cnv.isaVerifFish()) {
				Puce puce = puceDAO.findByID(Puce.class, cnv.getPuce().getIdPuce());
				Analyse analysePuce = AnalyseDAOImpl.getInstance().findByID(Analyse.class, puce.getAnalyse().getIdAnalyse());
				Prelevement prelevement = PrelevementDAOImpl.getInstance().findByID(Prelevement.class, analysePuce.getPrelevement().getIdPrelevement());
				if (cnv.isaVerifBioMol()) {
					List<VerifBiomol> listebm = VerifBiomolDAOImpl.getInstance().getVerifBiomolByIdAlteration(cnv.getIdAlteration());
					if (listebm.size() == 0) {
						TypeAnalyse ta = TypeAnalyseDAOImpl.getInstance().findByID(TypeAnalyse.class, 4);
						Analyse anabm = AnalyseDAOImpl.getInstance().getAnalyseByTypeAndNumeroPrelevement(4, prelevement.getNumeroPrelevement());
						if (anabm == null) {
							anabm = analysePuce.copier();
							anabm.setUfExec(4274);
							anabm.setTypeAnalyse(ta);
							AnalyseDAOImpl.getInstance().save(anabm);
							Historique h1 = new Historique();
							h1.setDate(new Date());
							h1.setRequete("Enregistrement " + anabm.toString());
							h1.setUtilisateur(ApplicationContexte.getInstance().getUtilisateur());
							historiqueDAO.save(h1);
						}
						List<Resultat> res = ResultatDAOImpl.getInstance().findAllByidAnalyse(anabm.getIdAnalyse());
						Resultat resultat = null;
						if (res.size() == 0) {
							resultat = new Resultat();
							resultat.setAnalyse(anabm);
							resultat.setChromosomes(cnv.getChromosome());
							resultat.setIdResultat(0);
							resultat.setHerite("Non vérifié");
							resultat.setResultat("Non rendu");
						} else {
							resultat = res.get(0);
							resultat.setChromosomes(resultat.getChromosomes() + "|" + cnv.getChromosome());

						}
						ResultatDAOImpl.getInstance().save(resultat);
						Historique h1 = new Historique();
						h1.setDate(new Date());
						h1.setRequete("Enregistrement " + resultat.toString());
						h1.setUtilisateur(ApplicationContexte.getInstance().getUtilisateur());
						historiqueDAO.save(h1);

						RenduBiomol rbm = RenduBiomolDAOImpl.getInstance().getRenduBioMolByIdResultat(resultat.getIdResultat());
						if (rbm == null) {
							rbm = new RenduBiomol();
							rbm.setBuild("hg19");
							rbm.setIdRenduBioMol(0);
							rbm.setPuce(puce);
							rbm.setResultat(resultat);
							rbm.setValide(0);
							RenduBiomolDAOImpl.getInstance().save(rbm);
							Historique hrbm = new Historique();
							hrbm.setDate(new Date());
							hrbm.setRequete("Enregistrement " + rbm.toString());
							hrbm.setUtilisateur(ApplicationContexte.getInstance().getUtilisateur());
							historiqueDAO.save(h1);
						}
						VerifBiomol vbm = new VerifBiomol(0, cnv);
						vbm.setAnalyse(anabm);
						vbm.setRenduBiomol(rbm);
						VerifBiomolDAOImpl.getInstance().save(vbm);
						Historique h2 = new Historique();
						h2.setDate(new Date());
						h2.setRequete("Enregistrement " + vbm.toString());
						h2.setUtilisateur(ApplicationContexte.getInstance().getUtilisateur());
						historiqueDAO.save(h2);
					}

				}

				if (cnv.isaVerifFish()) {
					List<VerifFish> listefish = VerifFishDAOImpl.getInstance().getVerifFishByIdAlteration(cnv.getIdAlteration());
					if (listefish.size() == 0) {
						TypeAnalyse ta = TypeAnalyseDAOImpl.getInstance().findByID(TypeAnalyse.class, 2);
						Analyse anaf = AnalyseDAOImpl.getInstance().getAnalyseByTypeAndNumeroPrelevement(2, prelevement.getNumeroPrelevement());
						if (anaf == null) {
							anaf = analysePuce.copier();
							anaf.setUfExec(4274);
							anaf.setTypeAnalyse(ta);
							AnalyseDAOImpl.getInstance().save(anaf);
							Historique h1 = new Historique();
							h1.setDate(new Date());
							h1.setRequete("Enregistrement " + anaf.toString());
							h1.setUtilisateur(ApplicationContexte.getInstance().getUtilisateur());
							historiqueDAO.save(h1);
						}
						List<Resultat> res = ResultatDAOImpl.getInstance().findAllByidAnalyse(anaf.getIdAnalyse());
						Resultat resultat = null;
						if (res.size() == 0) {
							resultat = new Resultat();
							resultat.setHerite("Non vérifié");
							resultat.setResultat("Non rendu");
							resultat.setAnalyse(anaf);
							resultat.setChromosomes(cnv.getChromosome());
							resultat.setIdResultat(0);
						} else {
							resultat = res.get(0);
						}
						ResultatDAOImpl.getInstance().save(resultat);
						Historique h1 = new Historique();
						h1.setDate(new Date());
						h1.setRequete("Enregistrement " + resultat.toString());
						h1.setUtilisateur(ApplicationContexte.getInstance().getUtilisateur());
						historiqueDAO.save(h1);

						RenduFish rf = RenduFishDAOImpl.getInstance().getRenduFishByIdResultat(resultat.getIdResultat());
						if (rf == null) {
							rf = new RenduFish();
							rf.setBuild("hg19");
							rf.setIdRenduFish(0);
							rf.setPuce(puce);
							rf.setResultat(resultat);
							rf.setValide(0);
							RenduFishDAOImpl.getInstance().save(rf);
							Historique hrf = new Historique();
							hrf.setDate(new Date());
							hrf.setRequete("Enregistrement " + rf.toString());
							hrf.setUtilisateur(ApplicationContexte.getInstance().getUtilisateur());
							historiqueDAO.save(h1);

						}
						VerifFish vf = new VerifFish(0, cnv);
						vf.setAnalyse(anaf);
						vf.setRenduFish(rf);
						VerifFishDAOImpl.getInstance().save(vf);
						Historique h2 = new Historique();
						h2.setDate(new Date());
						h2.setRequete("Enregistrement " + vf.toString());
						h2.setUtilisateur(ApplicationContexte.getInstance().getUtilisateur());
						historiqueDAO.save(h2);
					}
				}

			}
			HibernateUtil.commitTransaction();
		} catch (Exception ex) {
			ex.printStackTrace();
			HibernateUtil.rollbackTransaction();
		} finally {
			HibernateUtil.closeSession();
		}
	}

	@Override
	public String telechargerFichierSegment(Puce puce, String path, boolean sup300) {
		boolean aFaire = true;
		TypePuce typePuce = null;
		String message = "";
		int nb_traitees = 0;
		int nb_erreur = 0;
		Double mapd = null;
		String sexePuce = "I";
		Date dateScan = new Date();
		String nomFichier = path.substring(path.lastIndexOf("\\"));

		Analyse ana = AnalyseServiceImpl.getInstance().getAnalyseByIdAnalyse(puce.getAnalyse().getIdAnalyse());
		Prelevement prelevement = PrelevementServiceImpl.getInstance().getPrelevementById(ana.getPrelevement().getIdPrelevement());
		String numeroPrelevement = prelevement.getNumeroPrelevement();
		try {
			FileInputStream fichier = new FileInputStream(path);

			if (!nomFichier.contains(numeroPrelevement) && !nomFichier.contains("IntervalBasedReport")) {
				message += "Le nom du fichier ne correspond pas au numéro du patient! le téléchargement n'a pas eu lieu.";
			}
			if (message.isEmpty()) {
				String ligne;
				String param = "";
				String genome = "";
				String mmis = "";
				String mgss = "";
				String moos = "";

				// Puces Affymetrix 50k,250k,500k et 6.0
				if (puce.getTypePuce().getIdTypePuce() == 1 || puce.getTypePuce().getIdTypePuce() == 2 || puce.getTypePuce().getIdTypePuce() == 3 || puce.getTypePuce().getIdTypePuce() == 4 || puce.getTypePuce().getIdTypePuce() == 5 || puce.getTypePuce().getIdTypePuce() == 6) {
					if (!nomFichier.contains(".cn_segments")) {
						message += "Le fichier n'est pas un fichier segment.";
					} else {

						if (nomFichier.substring(0, 2) == "20") {
							Calendar cal = Calendar.getInstance();
							cal.set(Integer.parseInt(nomFichier.substring(0, 3)), Integer.parseInt(nomFichier.substring(4, 5)), Integer.parseInt(nomFichier.substring(6, 7)));
							dateScan = cal.getTime();
						} else {
							int posDate = nomFichier.lastIndexOf("_20");
							if (posDate > 0) {
								Calendar cal = Calendar.getInstance();
								cal.set(Integer.parseInt(nomFichier.substring(posDate + 1, posDate + 4)), Integer.parseInt(nomFichier.substring(posDate + 5, posDate + 6)), Integer.parseInt(nomFichier.substring(posDate + 7, posDate + 8)));
								dateScan = cal.getTime();
							}
						}

						InputStreamReader ipsr = new InputStreamReader(fichier);
						BufferedReader br = new BufferedReader(ipsr);
						while ((ligne = br.readLine()) != null) {
							// LECTURE DE TOUS LES PARAMETRES
							if (ligne.contains("#MinimumMarkersInSegment=")) {
								String[] s = ligne.split("#MinimumMarkersInSegment=");
								mmis = s[1].trim();
								continue;
							}
							if (ligne.contains("#MinimumGenomicSegmentSize=")) {
								String[] s = ligne.split("#MinimumGenomicSegmentSize=");
								mgss = s[1].trim();
								continue;
							}
							if (ligne.contains("#MaximumOverlapOfCNVWithSNP=")) {
								String[] s = ligne.split("#MaximumOverlapOfCNVWithSNP=");
								moos = s[1].trim();
								continue;
							}

							if (ligne.contains("#Arrayset=GenomeWideSNP_6")) {
								typePuce = ReferentielServiceImpl.getInstance().getTypePuceById(3);
								continue;
							}
							if (ligne.contains("#genome=hg18")) {
								message += "Impossible d'enregistrer, la puce est en HG18";
								genome = "hg18";
								break;
							}
							if (ligne.contains("#genome=hg19")) {
								genome = "hg19";
								continue;
							}
							if (ligne.contains("#gender=Male")) {
								sexePuce = "M";
								continue;
							}
							if (ligne.contains("#gender=Female")) {
								sexePuce = "F";
								continue;
							}
							if (ligne.contains("#madPairDiff=")) {
								String[] s = ligne.split("#madPairDiff=");
								mapd = Double.parseDouble(s[1].trim());
								continue;
							}
							if (ligne.contains("#")) {
								continue;
							}
							if (ligne.contains("Sample")) {
								continue;
							}
							nb_traitees++;

							// On d&eacute;coupe le fichier et on instancie des
							// AlterationChromosomique
							String[] elements = ligne.split("\t");

							// On v&eacute;rifie que le fichier soit un fichier
							// de
							// format "cn_segment" ou "cn_segment + Commentaire"
							if (elements.length != 15 && elements.length != 16) {
								continue;
							}
							Alteration alt = new Alteration();
							alt.setPuce(puce);
							alt.setIdAlteration(0);
							alt.setChromosome(elements[3]);
							alt.setDebutHg19(Long.parseLong(elements[10]));
							alt.setFinHg19(Long.parseLong(elements[11]));

							alt.setSondeDebut(elements[12]);
							alt.setSondeFin(elements[13]);

							alt.setLog2R(Integer.parseInt(elements[1]));
							alt.setNbMarqueurs(Integer.parseInt(elements[7]));
							alt.setaVerifBioMol(false);
							alt.setaVerifFish(false);
							alt.setVersionGenome(genome);
							alt.setPrecisionVerif("");
							alt.setConfidence(null);
							alt.setPublier(1);
							alt.setMozaic(false);
							alt.setEstCnpCalc(estCNPc(alt));
							if (!cnvExiste(alt)) {
								save(alt);
							}
						}
						br.close();

					}
				}// fin traitement affymetrix 50k,250k,500k et 6.0
				else if (puce.getTypePuce().getIdTypePuce() == 9 || puce.getTypePuce().getIdTypePuce() == 12) {
					if (!nomFichier.contains(".tsv") && !nomFichier.contains(".txt")) {
						message += "Le fichier n'est pas un fichier segment de type .tsv ou .txt.";
					} else {
						dateScan = new Date();
						if (nomFichier.substring(0, 2) == "20") {
							Calendar cal = Calendar.getInstance();
							cal.set(Integer.parseInt(nomFichier.substring(0, 3)), Integer.parseInt(nomFichier.substring(4, 5)), Integer.parseInt(nomFichier.substring(6, 7)));
							dateScan = cal.getTime();
						} else {
							int posDate = nomFichier.lastIndexOf("_20");
							if (posDate > 0) {
								Calendar cal = Calendar.getInstance();
								cal.set(Integer.parseInt(nomFichier.substring(posDate + 1, posDate + 4)), Integer.parseInt(nomFichier.substring(posDate + 5, posDate + 6)), Integer.parseInt(nomFichier.substring(posDate + 7, posDate + 8)));
								dateScan = cal.getTime();
							}
						}
						InputStreamReader ipsr = new InputStreamReader(fichier);
						BufferedReader br = new BufferedReader(ipsr);
						int nbLigne = 0;
						HashMap<String, Integer> index = new HashMap<String, Integer>();
						while ((ligne = br.readLine()) != null) {

							if (nbLigne == 0) {
								String[] titres = ligne.split("\t");
								int i = 0;
								for (String titre : titres) {
									if (titre.trim().equals("CN State")) {
										index.put("cn_statut", i);
									}
									if (titre.trim().equals("Type")) {
										index.put("Type", i);
									}
									if (titre.trim().equals("Chromosome")) {
										index.put("chromosome", i);
									}
									if (titre.trim().equals("Min")) {
										index.put("debut", i);
									}
									if (titre.trim().equals("Max")) {
										index.put("fin", i);
									}
									if (titre.trim().equals("Mean Marker Distance")) {
										index.put("Mean Marker Distance", i);
									}
									if (titre.trim().equals("Confidence")) {
										index.put("cn_statut", i);
									}
									if (titre.trim().equals("Marker Count")) {
										index.put("nb_marqueurs", i);
									}
									i++;
								}
							}

							else {
								nb_traitees++;
								// On d&eacute;coupe le fichier et on instancie
								// des
								// AlterationChromosomique
								String[] elements = ligne.split("\t");

								Alteration alt = new Alteration();
								alt.setIdAlteration(0);
								alt.setPuce(puce);
								if (index.containsKey("chromosome")) {
									alt.setChromosome(elements[index.get("chromosome")].trim());
								} else {
									alt.setChromosome("");
								}
								if (index.containsKey("debut")) {
									alt.setDebutHg19(Long.parseLong(elements[index.get("debut")].trim().replaceAll(",", "")));
								} else {
									alt.setDebutHg19(null);
								}
								if (index.containsKey("fin")) {
									alt.setFinHg19(Long.parseLong(elements[index.get("fin")].trim().replaceAll(",", "")));
								} else {
									alt.setFinHg19(null);
								}
								if (index.containsKey("cn_statut") && !elements[index.get("cn_statut")].isEmpty()) {
									alt.setLog2R(Float.parseFloat(elements[index.get("cn_statut")].trim()));
								}
								if (elements[index.get("Type")].equals("LCSH") || elements[index.get("Type")].equals("LOH")) {
									alt.setLog2R(-100);
								}
								if (elements[index.get("Type")].contains("Mosai")) {
									alt.setMozaic(true);
								} else {
									alt.setMozaic(false);
								}

								if (index.containsKey("nb_marqueurs")) {
									alt.setNbMarqueurs(Integer.parseInt(elements[index.get("nb_marqueurs")].trim()));
								} else {
									alt.setNbMarqueurs(-1);
								}
								if (index.containsKey("Confidence")) {
									alt.setConfidence(Double.parseDouble(elements[index.get("Confidence")].trim()));
								} else {
									alt.setConfidence(null);
								}
								alt.setSondeDebut("");
								alt.setSondeFin("");
								alt.setaVerifBioMol(false);
								alt.setaVerifFish(false);
								alt.setVersionGenome(genome);
								alt.setPrecisionVerif("");
								alt.setConfidence(null);
								alt.setPublier(1);
								alt.setEstCnpCalc(estCNPc(alt));
								if (!cnvExiste(alt)) {
									save(alt);
								}
							}
							nbLigne++;

						}
						br.close();
					}
				}// fin traitement affymetrix 2.7

				// traitement agilent
				else if (puce.getTypePuce().getMarquePuce().getLibelle().equals("Agilent")) {
					if (!nomFichier.contains(".tsv") && !nomFichier.contains(".txt") && !nomFichier.contains(".xls") && !nomFichier.contains(".csv")) {
						message += "Le fichier n'est pas un fichier segment de type .txt. ou .xls ou .csv";
					} else {
						String separateur = "";
						if (nomFichier.contains(".csv")) {
							separateur = ";";
						} else {
							separateur = "\t";
						}
						// On transforme le fichier en Ressources que l'on poste

						InputStreamReader ipsr = new InputStreamReader(fichier);
						BufferedReader br = new BufferedReader(ipsr);
						int nbLigne = 0;

						boolean debut = false;
						boolean enNbProbe = false;
						String[] header = null;
						String chrRef = "";
						double startRef = 999999999;
						int stopRef = 0;
						String startProbRef = "";
						Double log2RatioRef = null;
						String stopProbRef = "";
						int nb_marqueurs = 0;
						HashMap<String, Integer> titres = new HashMap<String, Integer>();

						if (nomFichier.substring(0, 2) == "20") {
							Calendar cal = Calendar.getInstance();
							cal.set(Integer.parseInt(nomFichier.substring(0, 3)), Integer.parseInt(nomFichier.substring(4, 5)), Integer.parseInt(nomFichier.substring(6, 7)));
							dateScan = cal.getTime();
						} else {
							int posDate = nomFichier.lastIndexOf("_20");
							if (posDate > 0) {
								Calendar cal = Calendar.getInstance();
								cal.set(Integer.parseInt(nomFichier.substring(posDate + 1, posDate + 4)), Integer.parseInt(nomFichier.substring(posDate + 5, posDate + 6)), Integer.parseInt(nomFichier.substring(posDate + 7, posDate + 8)));
								dateScan = cal.getTime();
							}
						}

						while ((ligne = br.readLine()) != null) {
							ligne = ligne.replaceAll("\"", "").trim();

							if (!debut) {
								if (ligne.contains("Genome: hg18")) {
									genome = "hg18";
									message += "Impossible d'enregistrer, la puce est en HG18";
									break;
								} else if (ligne.contains("Genome: hg19")) {
									genome = "hg19";
									continue;
								} else if (ligne.contains("AberrationNo")) {
									int pos = ligne.indexOf("#Probe");
									if (pos < 0) {
										enNbProbe = false;
									} else {
										enNbProbe = true;
									}
									header = ligne.split(separateur);
									int index = 0;
									for (String titrecolone : header) {
										titres.put(titrecolone.trim(), index);
										index++;
									}
									debut = true;
									continue;
								} else if (ligne.contains("Array Design Info:")) {
									if (!ligne.contains(numeroPrelevement)) {
										message += "Le fichier ne correspond pas au numéro du patient! le téléchargement n'a pas eu lieu.";
										aFaire = false;
									}
								} else {
									if (ligne.trim() != null && !ligne.trim().isEmpty()) {
										param += ligne.trim() + "\n";
									}
								}
							} else {
								if (header != null && aFaire) {
									// On d&eacute;coupe le fichier et on
									// instancie
									// des AlterationChromosomique
									String[] elements = ligne.split(separateur);
									if (elements.length > 3) {
										if (enNbProbe) {
											Alteration alt = new Alteration();
											alt.setPuce(puce);
											alt.setIdAlteration(0);
											alt.setChromosome(elements[titres.get("Chr")].trim().substring(3));
											alt.setDebutHg19(Long.parseLong(elements[titres.get("Start")].trim().replaceAll("[^a-zA-Z0-9]", "")));
											alt.setFinHg19(Long.parseLong(elements[titres.get("Stop")].trim().replaceAll("[^a-zA-Z0-9]", "")));

											if (titres.containsKey("Amplification")) {
												double a1 = Double.parseDouble(StringUtils.deleteWhitespace(elements[titres.get("Amplification")].trim().replaceAll("\"", "").replaceAll(",", ".")));
												if (a1 != 0) {
													alt.setLog2R(a1);
												}
											}
											if (titres.containsKey("Gain")) {
												double a1 = Double.parseDouble(StringUtils.deleteWhitespace(elements[titres.get("Gain")].trim().replaceAll("\"", "").replaceAll(",", ".")));
												if (a1 != 0) {
													alt.setLog2R(a1);
												}
											}
											if (titres.containsKey("Deletion")) {
												double a1 = Double.parseDouble(elements[titres.get("Deletion")].trim().replaceAll("\"", "").replaceAll(",", ".").replaceAll("\\s+", ""));
												if (a1 != 0) {
													alt.setLog2R(a1);
												}
											}
											if (titres.containsKey("Loss")) {
												double a1 = Double.parseDouble(elements[titres.get("Loss")].trim().replaceAll("\"", "").replaceAll(",", ".").replaceAll("\\s+", ""));
												if (a1 != 0) {
													alt.setLog2R(a1);
												}
											}

											if (titres.containsKey("#Gains") && elements[titres.get("#Gains")].trim().replaceAll("\"", "").replaceAll(",", ".").equals("1")) {
												alt.setLog2R(3);
											}
											if (titres.containsKey("#Gains") && elements[titres.get("#Gains")].trim().replaceAll("\"", "").replaceAll(",", ".").equals("2")) {
												alt.setLog2R(4);
											}
											if (titres.containsKey("#Losses") && elements[titres.get("#Losses")].trim().replaceAll("\"", "").replaceAll(",", ".").equals("1")) {
												alt.setLog2R(1);
											}
											if (titres.containsKey("#Losses") && elements[titres.get("#Losses")].trim().replaceAll("\"", "").replaceAll(",", ".").equals("2")) {
												alt.setLog2R(0);
											}

											alt.setNbMarqueurs(Integer.parseInt(elements[titres.get("#Probes")].trim().replaceAll("\"", "").replaceAll(",", ".")));

											if (titres.containsKey("pval")) {
												if (!elements[titres.get("pval")].trim().contains("NA")) {
													alt.setConfidence(Double.parseDouble(elements[titres.get("pval")].trim().replaceAll("\"", "").replaceAll(",", ".")));
												}
											}
											alt.setSondeDebut("");
											alt.setSondeFin("");
											alt.setaVerifBioMol(false);
											alt.setaVerifFish(false);
											alt.setVersionGenome(genome);
											alt.setPrecisionVerif("");
											alt.setPublier(1);
											alt.setEstCnpCalc(estCNPc(alt));

											if (alt.getChromosome() != null && !alt.getChromosome().isEmpty()) {
												if (sup300 && ((alt.getFinHg19() - alt.getDebutHg19()) > 300000 || alt.getChromosome().equals("X") || alt.getChromosome().equals("x"))) {

													if (!cnvExiste(alt)) {
														save(alt);
													}
													nb_traitees++;
												}
												if (!sup300) {

													if (!cnvExiste(alt)) {
														save(alt);
													}
													nb_traitees++;
												}
											}

										} else {
											String chr = elements[titres.get("ChrName")].trim().substring(3);
											Double log2Ratio = null;
											if (elements[titres.get("Amplification")] != null && !elements[titres.get("Amplification")].isEmpty() && !elements[titres.get("Amplification")].equals("0")) {
												log2Ratio = Double.parseDouble(elements[titres.get("Amplification")].trim());
											}
											if (elements[titres.get("Gain")] != null && !elements[titres.get("Gain")].isEmpty() && !elements[titres.get("Gain")].equals("0")) {
												log2Ratio = Double.parseDouble(elements[titres.get("Gain")].trim());
											}
											if (elements[titres.get("Deletion")] != null && !elements[titres.get("Deletion")].isEmpty() && !elements[titres.get("Deletion")].equals("0")) {
												log2Ratio = Double.parseDouble(elements[titres.get("Deletion")].trim());
											}
											if (elements[titres.get("Loss")] != null && !elements[titres.get("Loss")].isEmpty() && !elements[titres.get("Loss")].equals("0")) {
												log2Ratio = Double.parseDouble(elements[titres.get("Loss")].trim());
											}
											if (log2RatioRef.equals(log2Ratio) && chr.equals(chrRef)) {

												if (Double.parseDouble(elements[titres.get("Start")].trim().replaceAll("\"", "").replaceAll(",", "")) < startRef) {
													startRef = Double.parseDouble(elements[titres.get("Start")].trim().replaceAll("\"", "").replaceAll(",", ""));
													startProbRef = elements[titres.get("ProbeName")].trim().replaceAll("\"", "");

												}
												if (Double.parseDouble(elements[titres.get("Stop")].trim().replaceAll("\"", "").replaceAll(",", "")) < startRef) {
													stopRef = Integer.parseInt(elements[titres.get("Stop")].trim().replaceAll("\"", "").replaceAll(",", ""));
													stopProbRef = elements[titres.get("ProbeName")].trim().replaceAll("\"", "");

												}
												nb_marqueurs++;
											} else {
												if (!chrRef.isEmpty()) {
													Alteration alt = new Alteration();
													alt.setIdAlteration(0);
													alt.setPuce(puce);
													alt.setChromosome(chrRef);
													alt.setDebutHg19((long) startRef);
													alt.setFinHg19((long) stopRef);

													alt.setLog2R(log2RatioRef);
													alt.setNbMarqueurs(nb_marqueurs);

													alt.setSondeDebut(startProbRef);
													alt.setSondeFin(stopProbRef);
													alt.setaVerifBioMol(false);
													alt.setaVerifFish(false);
													alt.setVersionGenome(genome);
													alt.setPrecisionVerif("");
													alt.setPublier(1);
													alt.setEstCnpCalc(estCNPc(alt));

													if (alt.getChromosome() != null && !alt.getChromosome().isEmpty()) {
														if (sup300 && ((alt.getFinHg19() - alt.getDebutHg19()) > 300000 || alt.getChromosome().equals("X") || alt.getChromosome().equals("x"))) {

															if (!cnvExiste(alt)) {
																save(alt);
															}
															nb_traitees++;
														}
														if (!sup300) {

															if (!cnvExiste(alt)) {
																save(alt);
															}
															nb_traitees++;
														}
													}
												}

												chrRef = chr;
												startRef = Double.parseDouble(elements[titres.get("Start")].trim().replaceAll("\"", "").replaceAll(",", ""));
												stopRef = Integer.parseInt(elements[titres.get("Stop")].trim().replaceAll("\"", "").replaceAll(",", ""));
												log2RatioRef = log2Ratio;
												nb_marqueurs = 1;
												startProbRef = elements[titres.get("ProbeName")].trim().replaceAll("\"", "");
												stopProbRef = elements[titres.get("ProbeName")].trim().replaceAll("\"", "");
											}
										}
									}
								}
							}
						}
						br.close();
						if (header != null && message.isEmpty() && aFaire) {
							if (!enNbProbe) {
								if (chrRef != null && !chrRef.equals("0")) {

									Alteration alt = new Alteration();
									alt.setIdAlteration(0);
									alt.setPuce(puce);
									alt.setChromosome(chrRef);
									alt.setDebutHg19((long) startRef);
									alt.setFinHg19((long) stopRef);

									alt.setLog2R(log2RatioRef);
									alt.setNbMarqueurs(nb_marqueurs);

									alt.setSondeDebut(startProbRef);
									alt.setSondeFin(stopProbRef);
									alt.setaVerifBioMol(false);
									alt.setaVerifFish(false);
									alt.setVersionGenome(genome);
									alt.setPrecisionVerif("");
									alt.setPublier(1);
									alt.setEstCnpCalc(estCNPc(alt));

									if (alt.getChromosome() != null && !alt.getChromosome().isEmpty()) {
										if (sup300 && ((alt.getFinHg19() - alt.getDebutHg19()) > 300000 || alt.getChromosome().equals("X") || alt.getChromosome().equals("x"))) {

											if (!cnvExiste(alt)) {
												save(alt);
											}
											nb_traitees++;
										}
										if (!sup300) {

											if (!cnvExiste(alt)) {
												save(alt);
											}
											nb_traitees++;
										}
									}

								}
							}
						}
					}
				}// fin de agilent
				if (message.isEmpty()) {
					puce.setDateScan(dateScan);
					puce.setSexePuce(sexePuce);
					if (typePuce != null) {
						puce.setTypePuce(typePuce);
					}
					if (puce.getTypePuce().getIdTypePuce() == 1 || puce.getTypePuce().getIdTypePuce() == 2 || puce.getTypePuce().getIdTypePuce() == 3 || puce.getTypePuce().getIdTypePuce() == 4 || puce.getTypePuce().getIdTypePuce() == 5 || puce.getTypePuce().getIdTypePuce() == 6) {
						puce.setParametres(puce.getParametres() + "Nb mq min par CNV : " + mmis + " Taille min du CNV : " + mgss + " Nb max OverlapOfCNVWithSNP : " + moos);
						if (mapd != null) {
							List<TypeQC> tqcs = ReferentielServiceImpl.getInstance().getTypeQCByTypePuce(puce.getTypePuce());
							for (TypeQC typeQC : tqcs) {
								if (typeQC.getLibelle().contains("mapd")) {
									ControleQualite qc = PuceServiceImpl.getInstance().getQCByPuceTypeQc(puce, typeQC.getLibelle());
									if (qc == null) {
										qc = new ControleQualite();
										qc.setPuce(puce);
										qc.setIdControleQC(0);
										qc.setTypeQC(typeQC);
									}
									qc.setValeur(mapd);
									puce.addQc(qc);
								}
							}

						}

					} else if (puce.getTypePuce().getMarquePuce().getLibelle().equals("Agilent")) {
						String resolution = "";
						if (sup300) {
							resolution = param + "\nRésolution moyenne : 300kb sur les autosomes et le Y (chez les hommes) et 100kb sur X.";
						} else {
							resolution = param + "\nRésolution moyenne : 100kb.";
						}
						puce.setParametres(puce.getParametres() + resolution);
					}
					List<Alteration> alts = AlterationServiceImpl.getInstance().findAllByidPuce(puce.getIdPuce());
					if (alts.size() == 0) {
						SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
						Date datedujour = new Date();
						String comm = "";
						if (puce.getCommentaireAnnotateur() != null) {
							comm = puce.getCommentaireAnnotateur();
						}
						puce.setCommentaireAnnotateur(comm + "La puce ne contient aucun CNV à la résolution indiquée dans les paramètres d'analyse. La puce peut donc être rendue normale.(" + formatter.format(datedujour) + "-Annotation automatique");
						puce.setDateAnnotation(new Date());
						if (puce.getAnnotateur() == null) {
							puce.setAnnotateur(UtilisateurServiceImpl.getInstance().getUtilisateurByNom("Cytogalaxie"));
						}
					} else {
						boolean queCNPc = true;
						for (Alteration alteration : alts) {
							if (!alteration.getEstCnpCalc()) {
								queCNPc = false;
								break;
							}
						}
						if (queCNPc) {
							SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
							Date datedujour = new Date();
							String comm = "";
							if (puce.getCommentaireAnnotateur() != null) {
								comm = puce.getCommentaireAnnotateur();
							}
							puce.setCommentaireAnnotateur(comm + "La puce ne contient que des polymorphismes à la résolution indiquée dans les paramètres d'analyse. La puce peut donc être rendue normale.(" + formatter.format(datedujour) + "-Annotation automatique");
							puce.setDateAnnotation(new Date());
							if (puce.getAnnotateur() == null) {
								puce.setAnnotateur(UtilisateurServiceImpl.getInstance().getUtilisateurByNom("Cytogalaxie"));
							}
						}
					}
					PuceServiceImpl.getInstance().save(puce);

					if (puce.isPrincipale()) {
						Personne p = PersonneServiceImpl.getInstance().getPersonneById(PersonneServiceImpl.getInstance().getIdPersonneFromObject(puce));
						p.setIdPucePrincipale(puce.getIdPuce());
						PersonneServiceImpl.getInstance().save(p);

					}

					// $ALTERATION_DAO->calculCNP($puce->idpuce,$genome);
				}

				// On supprime le fichier de segments

				message += nb_traitees + "CNV ont été traités [" + nb_erreur + "erreur(s)]";
			}
		} catch (FileNotFoundException e) {

			message += "Erreur lors de l'ouverture du fichier" + path;
		} catch (NumberFormatException e) {

			message += "Erreur de format de nombre lors du téléchargement du fichier" + path;
		} catch (IOException e) {
			message += "Erreur de IO lors du téléchargement du fichier" + path;
		}
		return message;

	} // Fin traitement du fichier

	@Override
	public List<Alteration> getAlterationAVerifqPCR(Integer idPuce) {
		List<Alteration> alterations = null;
		HibernateUtil.beginTransaction();
		alterations = alterationDAO.getAlterationAVerifqPCR(idPuce);
		HibernateUtil.commitTransaction();
		HibernateUtil.closeSession();
		return alterations;
	}

	@Override
	public List<Alteration> getAlterationAVerifFISH(Integer idPuce) {
		List<Alteration> alterations = null;

		HibernateUtil.beginTransaction();
		alterations = alterationDAO.getAlterationAVerifFISH(idPuce);
		HibernateUtil.commitTransaction();
		HibernateUtil.closeSession();
		return alterations;
	}

	@Override
	public List<Alteration> getAlterationAVerif(Integer idPuce) {
		List<Alteration> alterations = null;

		HibernateUtil.beginTransaction();
		alterations = alterationDAO.getAlterationAVerif(idPuce);
		HibernateUtil.commitTransaction();
		HibernateUtil.closeSession();
		return alterations;
	}

	@Override
	public long nbAltByidPuce(Integer idPuce) {
		long nbAlt = 0;
		HibernateUtil.beginTransaction();
		nbAlt = alterationDAO.nbAltByidPuce(idPuce);
		HibernateUtil.commitTransaction();
		HibernateUtil.closeSession();
		return nbAlt;
	}

	@Override
	public int getIdTypeCausalByAlteration(Integer idAlteration) {
		int idTypeCausal = 0;
		HibernateUtil.beginTransaction();
		idTypeCausal = annotationDAO.getIdTypeCausalByAlteration(idAlteration);
		HibernateUtil.commitTransaction();
		HibernateUtil.closeSession();
		return idTypeCausal;
	}

	@Override
	public void telechargerFichierQC(Puce puce, String path, String numPrel) {
		FileInputStream fichier;
		try {
			fichier = new FileInputStream(path);
			String message = "";
			InputStreamReader ipsr = new InputStreamReader(fichier);
			BufferedReader br = new BufferedReader(ipsr);
			String ligne = "";
			while ((ligne = br.readLine()) != null) {
				if (ligne.contains("Sample Name :")) {
					if (!ligne.contains(numPrel)) {
						message = "Mauvais numéro de dossier";
						continue;
					}
				}
				if (message.isEmpty()) {
					if (ligne.contains("IsGoodGrid")) {
						String[] tab = ligne.split("\t");
						if (tab != null && tab.length > 2) {
							ControleQualite qc1 = createQC(puce, "IsGoodGrid", Double.parseDouble(tab[1].trim().replaceAll(",", ".")));
							puce.addQc(qc1);
						}
						continue;
					}
					if (ligne.contains("AnyColorPrcntFeatNonUnifOL")) {
						String[] tab = ligne.split("\t");
						if (tab != null && tab.length > 2) {
							ControleQualite qc1 = createQC(puce, "AnyColorPrcntFeatNonUnifOL", Double.parseDouble(tab[1].trim().replaceAll(",", ".")));
							puce.addQc(qc1);
						}
						continue;
					}
					if (ligne.contains("DerivativeLR_Spread\t")) {
						String[] tab = ligne.split("\t");
						if (tab != null && tab.length > 2) {
							ControleQualite qc1 = createQC(puce, "DerivativeLR_Spread ", Double.parseDouble(tab[1].trim().replaceAll(",", ".")));
							puce.addQc(qc1);
						}
						continue;
					}
					if (ligne.contains("DerivativeLR_Spread_Norm")) {
						String[] tab = ligne.split("\t");
						if (tab != null && tab.length > 2) {
							ControleQualite qc1 = createQC(puce, "DerivativeLR_Spread_Norm", Double.parseDouble(tab[1].trim().replaceAll(",", ".")));
							puce.addQc(qc1);
						}
						continue;
					}
					if (ligne.contains("gRepro")) {
						String[] tab = ligne.split("\t");
						if (tab != null && tab.length > 2) {
							ControleQualite qc1 = createQC(puce, "gRepro", Double.parseDouble(tab[1].trim().replaceAll(",", ".")));
							puce.addQc(qc1);
						}
						continue;
					}
					if (ligne.contains("g_BGNoise")) {
						String[] tab = ligne.split("\t");
						if (tab != null && tab.length > 2) {
							ControleQualite qc1 = createQC(puce, "g_BGNoise", Double.parseDouble(tab[1].trim().replaceAll(",", ".")));
							puce.addQc(qc1);
						}
						continue;
					}
					if (ligne.contains("g_Signal2Noise")) {
						String[] tab = ligne.split("\t");
						if (tab != null && tab.length > 2) {
							ControleQualite qc1 = createQC(puce, "g_Signal2Noise", Double.parseDouble(tab[1].trim().replaceAll(",", ".")));
							puce.addQc(qc1);
						}
						continue;
					}
					if (ligne.contains("g_SignalIntensity")) {
						String[] tab = ligne.split("\t");
						if (tab != null && tab.length > 2) {
							ControleQualite qc1 = createQC(puce, "g_SignalIntensity", Double.parseDouble(tab[1].trim().replaceAll(",", ".")));
							puce.addQc(qc1);
						}
						continue;
					}
					if (ligne.contains("rRepro")) {
						String[] tab = ligne.split("\t");
						if (tab != null && tab.length > 2) {
							ControleQualite qc1 = createQC(puce, "rRepro", Double.parseDouble(tab[1].trim().replaceAll(",", ".")));
							puce.addQc(qc1);
						}
						continue;
						
					}
					if (ligne.contains("r_BGNoise")) {
						String[] tab = ligne.split("\t");
						if (tab != null && tab.length > 2) {
							ControleQualite qc1 = createQC(puce, "r_BGNoise", Double.parseDouble(tab[1].trim().replaceAll(",", ".")));
							puce.addQc(qc1);
						}
						continue;
					}
					if (ligne.contains("r_Signal2Noise")) {
						String[] tab = ligne.split("\t");
						if (tab != null && tab.length > 2) {
							ControleQualite qc1 = createQC(puce, "r_Signal2Noise", Double.parseDouble(tab[1].trim().replaceAll(",", ".")));
							puce.addQc(qc1);
						}
						continue;
					}
					if (ligne.contains("r_SignalIntensity")) {
						String[] tab = ligne.split("\t");
						if (tab != null && tab.length > 2) {
							ControleQualite qc1 = createQC(puce, "r_SignalIntensity", Double.parseDouble(tab[1].trim().replaceAll(",", ".")));
							puce.addQc(qc1);
						}
						continue;
					}
					if (ligne.contains("LogRatioImbalance")) {
						String[] tab = ligne.split("\t");
						if (tab != null && tab.length > 2) {
							ControleQualite qc1 = createQC(puce, "AbsLogRatioImbalance", Math.abs(Double.parseDouble(tab[1].trim().replaceAll(",", "."))));
							puce.addQc(qc1);
						}
						continue;
					}
					if (ligne.contains("Waviness")) {
						String[] tab = ligne.split("\t");
						if (tab != null && tab.length > 2) {
							ControleQualite qc1 = createQC(puce, "Waviness", Double.parseDouble(tab[1].trim().replaceAll(",", ".")));
							puce.addQc(qc1);
						}
						continue;
					}
				}
			}
			PuceServiceImpl.getInstance().save(puce);
			// List<TypeQC> tqcs =
			// ReferentielServiceImpl.getInstance().getTypeQCByTypePuce(puce.getTypePuce());
			// ControleQualite qc =
			// PuceServiceImpl.getInstance().getQCByPuceTypeQc(puce,
			// typeQC.getLibelle());
			// if (qc == null) {
			// qc = new ControleQualite();
			// qc.setPuce(puce);
			// qc.setIdControleQC(0);
			// qc.setTypeQC(typeQC);
			// }
			// qc.setValeur(mapd);
			// puce.addQc(qc);
			// }
			// }

		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public ControleQualite createQC(Puce puce, String typeQCs, Double valeur) {
		TypeQC typeQC = ReferentielServiceImpl.getInstance().getTypeQCByTypePuceAndLibelle(puce.getTypePuce(), typeQCs);

		ControleQualite qc = PuceServiceImpl.getInstance().getQCByPuceTypeQc(puce, typeQC.getLibelle());
		if (qc == null) {
			qc = new ControleQualite();
			qc.setPuce(puce);
			qc.setIdControleQC(0);
			qc.setTypeQC(typeQC);
		}
		qc.setValeur(valeur);

		return qc;
	}
}